package com.kk.springboot_001.service;


import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;

import com.kk.springboot_001.mapper.UserMapper;
import com.kk.springboot_001.pojo.User;

import com.kk.springboot_001.pojo.dto.UserDto;
import com.kk.springboot_001.pojo.dto.UserUpdateDto;

import jakarta.validation.constraints.Email;
import jakarta.validation.constraints.NotBlank;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service;

import java.util.List;

@Slf4j
@Service //spring的bean
public class UserServiceImpl implements UserService {

    @Autowired
    UserMapper userMapper;
    @Autowired
    private PasswordEncoder passwordEncoder; //密码加密器

    @Override
    public User add(UserDto userDto) {
        // 检查用户名和邮箱是否已存在
        User existingUser = findUserByUserNameAndEmail(userDto.getUserName(), userDto.getEmail());
        if (existingUser != null) {
            // 如果存在，可以抛出一个自定义异常，这里为了简化，我们直接返回null或抛出运行时异常。
            throw new RuntimeException("用户已存在");
        }
        User userPojo = new User();
        BeanUtils.copyProperties(userDto, userPojo);
        // 对密码进行加密
        String encodedPassword = passwordEncoder.encode(userDto.getPassword());
        userPojo.setPassword(encodedPassword);
        userMapper.insert(userPojo);
        return userPojo;
    }

    private User findUserByUserNameAndEmail(@NotBlank(message = "用户名不能为空") String userName, @Email(message = "email格式不正确") String email) {
        return userMapper.selectOne(new QueryWrapper<User>()
                .eq("user_name", userName)
                .eq("email", email));
    }

    @Override
    public User getUser(Integer userId) {
        return userMapper.selectById(userId);
    }

    /**
     * 更新用户信息
     *
     * @param updateDto
     * @return
     */
    @Override
    public User update(UserUpdateDto updateDto) {
        // 1. 根据用户ID查询出原有的用户信息
        User user = userMapper.selectById(updateDto.getUserId());
        if (user == null) {
            throw new RuntimeException("用户不存在");
        }

        // 2. 检查新用户名是否已存在（如果用户提交了新的用户名）
        if (updateDto.getUserName() != null && !updateDto.getUserName().isEmpty()) {
            // 如果新用户名和旧用户名不同，才进行唯一性检查
            if (!updateDto.getUserName().equals(user.getUserName())) {
                QueryWrapper<User> queryWrapper = new QueryWrapper<>();
                queryWrapper.eq("user_name", updateDto.getUserName());
                User existingUser = userMapper.selectOne(queryWrapper);

                if (existingUser != null) {
                    throw new RuntimeException("该用户名已被使用，请更换！");
                }
                user.setUserName(updateDto.getUserName());
            }
        }

        // 3. 处理邮箱和密码，只更新非空字段
        if (updateDto.getEmail() != null && !updateDto.getEmail().isEmpty()) {
            user.setEmail(updateDto.getEmail());
        }

        // 4. 对新密码进行加密（如果用户提交了新密码）
        if (updateDto.getPassword() != null && !updateDto.getPassword().isEmpty()) {
            // 将新密码进行加密后再存储
            user.setPassword(passwordEncoder.encode(updateDto.getPassword()));
        }

        // 5. 执行更新操作
        int rowsAffected = userMapper.updateById(user);
        if (rowsAffected > 0) {
            // 返回更新后的用户信息（可省略密码）
            return user;
        } else {
            throw new RuntimeException("用户信息更新失败，请重试！");
        }
    }
    @Override
    public void delete(Integer userId) {
        userMapper.deleteById(userId);
    }

//    @Override
//    public LoginResponseDto login(LoginDto loginDto) {
//        // 创建一个查询构造器
//        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
//        // 设置查询条件
//        queryWrapper.eq("user_name", loginDto.getUserName())
//                .eq("password", loginDto.getPassword());
//        User user = userMapper.selectOne(queryWrapper);
//        if (user == null) {
//            throw new RuntimeException("用户名或密码错误");
//        } else {
//            // 登录成功，生成token并返回给前端
//            String token = JwtUtils.generateToken(user.getUserName());
//            log.info("登录成功，token：{}", token);
//            return new LoginResponseDto(user, token);
//        }
//    }

    @Override
    public Integer getUserIdByUserName(String userName) {
        return userMapper.getUserIdByUserName(userName);
    }
}
